package cn.sppxpp.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.util.*;

/**
 * @author spp
 * @date 2020-10-27 15:03
 * 类加载
 **/
public class ClassLoaderUtil {

    /**
     * 存储所有的class类
     */
    public  Map<String,Class<?>> allClass = new HashMap<>();

    /**
     * 存储所有扫描到的class名称
     */
    public  List<String> className = new ArrayList<>();

    /**
     * 装载所有的class
     * @param properties 配置文件
     * @throws IOException
     */
    public void loadClass(Properties properties) throws IOException {
        String pack = properties.get("ioc.pack.scan").toString().trim().replaceAll("\\.","/");
        scanClass(pack);
        className.forEach(e->{
            try {
                Class<?> aClass = Class.forName(e);
                allClass.put(e.substring(e.lastIndexOf(".")+ 1),aClass);
            } catch (ClassNotFoundException ex) {
                ex.printStackTrace();
            }
        });
    }

    /**
     * 扫描所有的class文件
     * @param pack
     * @throws FileNotFoundException
     */
    private void scanClass(String pack) throws FileNotFoundException {
        URL url = ClassLoaderUtil.class.getClassLoader().getResource(pack);
        File file = new File(url.getFile());
        if (file.exists() && file.isDirectory()) {
            File[] files = file.listFiles();
            for (File fileSon : files) {
                if (fileSon.isDirectory()){
                    //递归扫描所有的文件
                    scanClass(pack + "/" + fileSon.getName());
                }else {
                    int beginIndex = fileSon.getName().lastIndexOf(".");
                    if(beginIndex != -1 && ".class".equals(fileSon.getName().substring(beginIndex))){
                        //扫描所有以class结尾的文件
                        //去除尾部的.class后缀,并拼接后缀
                        String cn = pack.replaceAll("/",".") +"." + fileSon.getName().substring(0,fileSon.getName().length() - 6);
                        className.add(cn);
                    }
                }
            }
        } else {
            throw new FileNotFoundException("没有找到需要扫描的文件目录");
        }
    }

}
